﻿#ifndef CHARTOPERATE_H
#define CHARTOPERATE_H

#include <QObject>
#include <QFont>
#include <QSharedPointer>
#include <QMessageBox>
#include <QInputDialog>
#include <QPushButton>
#include <QMouseEvent>
#include <QPen>
#include <QMenu>
#include <QAction>


#include <QLabel>
#include <QComboBox>
#include <QLineEdit>
#include <QPushButton>


#include "global.h"
#include "plotchartutils.h"
#include "dataoperate.h"
#include "qcustomplot.h"

#define DEFAULT_YVALUE 1
#define COLOR_CYAN QColor(25, 187, 180)
#define COLOR_BLUE QColor(0, 129, 255)


class ChartOperate : public QObject
{
    Q_OBJECT
public:
    explicit ChartOperate(QCustomPlot *plot);

signals:

public slots:
    // 设置Chart显示
    void selectionChanged();
    void mousePress(QMouseEvent* event);
    void mouseMove(QMouseEvent* event);
    void mouseRelease(QMouseEvent* event);


    void mouseWheel();
    void contextMenuRequest(QPoint pos);
    void plotPointClick(QCPAbstractPlottable* plottable, int dataIndex, QMouseEvent* event);
    void legendPointClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event);
    void legendPointDBClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event);

    // 鼠标右键
    void actionChtAddLine();
    void actionChtAddPt();
    void actionChtDelLine();
    void actionChtDelPt();
    void removeAllGraphs();
    void actionLegendUp();
    void actionLegendDown();
    void actionChtMidInsertLine();
    void modifyChtLegendName();


    // 锁定图表
    void actionLockCht();

    // 下拉框选中
    void selectTextChanged(int index);

    // 按钮按下
    void saveBtnSlot();


public:

    // 生成初始化空白图表
    void makeInitChart();

    // 图表其他属性设置
    void initChartProperty();

    // 信号槽绑定
    void initSignals();

    // 获取初始化数据
    void getInitDataAndAddLine();

    // 设置标题名称
    void setChartTitle(QString text);

    // 坐标轴设置
    void setChartAxis();

    // 添加序列
    void addChartLine(int layerID, QString UUID, QString name, QVector<double> pointXList, QVector<double> pointYList);


    // 修改序列
    void modifyChartLine();

    // 删除序列
    void delChartLine();

    // 添加点
    void addChartPoint();

    // 修改点
    void modifyChartPoint(QString UUID, int pointIndex, double xValue, double yValue);

    // 删除点
    void delChartPoint(double sortKey);

    // 删除所有线
    void delAllChart();

    // 添加文字
    void addSeriesText();

    // 添加层ID与UUID对应关系
    void delApointLayerID(QString UUID);

    // 根据UUID获取层
    int getLayerIDByUUID(QString UUID);

    void chkCntPointXAxis(int cntXValue);

    // 获取当前线的最大点横坐标
    int getCntLineMaxXAxis();


    // 添加点固定点Vector的值
    void addFixedVector(int lineIndex, QVector<double> &x, QVector<double> &y, QVector<double> &originalY);

    // 清空图表
    void clearChart();

    // 重新渲染Chart
    void reRenderChart(QList<ConfData> listConfData);

    //    // 添加数据到全局数据
    //    void addChartLineDataToConf(int index, QString name, QPointF pointF);

    // 打开文件
    void openANewFile(QString fileName);

    // 保存当前数据
    void saveCntDataToFile();

    // 修改当前文件名
    bool modifyFileName(QString fileName);

    // 文件另存为
    void saveAnOtherFile(QString fileName);

    // 是否显示图例
    void isShowLegend(bool isShow);

    // 设置label
    void setLabelPos(QLabel *label);

    // 设置选中线的样式
    void setSelectChtLineStyle(int sceneIndex);

    // 下拉选择文件
    QString setIntactFilePath(QString fileName);

    // 重新渲染下拉的框
    void reloadSelect(QString cntName);
    void setCBoxFiles(QComboBox *cboxFiles);
    void setCBoxInitSetting();

    // 设置保存的值
    void setSaveTextEdit(QLineEdit *saveEdit);
    void setSaveButton(QPushButton *saveBtn);

    // 获取中间值
    int getLineMidValue(QString UUID);
    QMap<QString, int> getAllLineMidValue();






private:
    void setSaveOtherFile();
    void setSaveNowFile();


private:
    QCustomPlot *m_plot;
    DataOperate  *m_data;
    QList<ConfData> m_listConfData; // 全部数据

    int m_XScale;    // X缩放的值
    int m_YScale;    // Y缩放的值
    int m_xMinRange; // X最小值
    int m_xMaxRange; // X最大值
    int m_yMinRange; // Y最小值
    int m_yMaxRange; // Y最大值

    bool                    m_changeFlag;              // 是否更改图形数据
    QList<QString>          m_UUIDAndID;               // UUID与层的对应关系
    QString                 m_cntLineUUID;             // 当前点UUID
    int                     m_cntPointIndex;           // 当前点的索引
    QPointF                 m_cntLinePoint;            // 当前点的坐标

    // 拖拽
    int                     m_cntDargIndex;            // 当前拖拽点的索引
    QString                 m_cntDragUUID;             // 当前拖拽点的UUID
    bool                    m_dragFlag;                // 是否能拖拽标识

    QLabel                  *m_lblPos;                 // 界面点坐标
    QComboBox               *m_cboxFiles;              // 文件下拉
    QLineEdit               *m_saveEdit;               // 保存文件名
    QPushButton             *m_saveBtn;                // 保存文件按钮

    QPoint                  m_mousePos;                // 鼠标右键添加点的坐标
    int                     m_cntSelectScene;          // 当前选择的场景索引
    bool                    m_isUpFlag;                // 删除线后是否上移重绘
    bool                    m_legendIsShow;            // 设置legend是否显示， 默认显示
    QCPPlottableLegendItem  *m_cntLegendItem;          // 当前选中legend
    QString                 m_cntLegendUUID;           // 修改图例对应图表的UUID
    QString                 m_lastFileName;            // 上一次文件名
    int                     m_lastCntIndex;            // 记录上一次的索引
    QList<QString>          m_cBoxFileNames;           // cBox的值
    bool                    m_selectFlag;              // 下拉标识


};

#endif // CHARTOPERATE_H
